package vip.zhenzicheng.timer;

import lombok.extern.slf4j.Slf4j;

import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

/**
 * Timer存在bug,当任务执行超时导致定时任务时间不准确或者丢任务
 * Timer底层还是调用Thread.run方法,是普通单线程方法
 * 由于单线程阻塞所以定时任务会出问题,应该使用多线程或线程池等
 *
 * @author zhenzicheng
 * @date 2023-03-12 11:20
 */
public class TimerTest {
  public static void main(String[] args) {
    // 任务启动了
    Timer timer = new Timer();
    for (int i = 0; i < 2; i++) {
      // 任务睡眠3s
      TimerTask task = new FooTimerTask("foo" + i);
      // 添加任务
      // 距离上次任务每次执行完后2s再执行
      // 间隔时间2s,任务执行时间3s,超时导致任务部分丢失
      timer.schedule(task, new Date(), 2000);
      // 不管上一次任务，严格按照预设时间
      // 也存在上面的问题,任务执行超时会导致执行时间混乱
      // timer.scheduleAtFixedRate(task, 0, 2000);
    }

  }
}

@Slf4j
class FooTimerTask extends TimerTask {
  private String name;

  FooTimerTask(String name) {
    this.name = name;
  }

  @Override
  public void run() {
    try {
      log.info("name:{}, startTime:{}", this.name, new Date());
      Thread.sleep(3000);
      log.info("name:{}, endTime:{}", this.name, new Date());

    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }
}
